package com.lcx.movie.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lcx.movie.entity.Hall;
import com.lcx.movie.entity.Schedule;
import com.lcx.movie.mapper.*;
import com.lcx.movie.service.SeatsService;
import net.minidev.json.JSONObject;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lcx.movie.mapper.OrderinfoMapper;
import com.lcx.movie.entity.Orderinfo;
import com.lcx.movie.service.OrderinfoService;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @Description  
 * @version 1.0 
 * @author lcx
 * @date 2025/2/9 11:25
 */
@Service

public class OrderinfoServiceImpl extends ServiceImpl<OrderinfoMapper, Orderinfo> implements OrderinfoService {
    @Autowired
    private OrderinfoMapper orderMapper;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private HallMapper hallMapper;
    @Autowired
    private ScheduleMapper scheduleMapper;
    @Autowired
    private CinemaMapper cinemaMapper;
    @Autowired
    private MovieMapper movieMapper;
    @Autowired
    private SnacksMapper snacksMapper;
    @Autowired
    private SeatsMapper seatsMapper;
    @Autowired
    private ScheduleSeatMapper scheduleSeatMapper;
    //分页模糊查询订单表(用户账号)

    /**
     * //分页模糊查询订单表(用户账号)
     * @param orderState 订单状态
     * @return 订单信息集合
     */
    @Override
    public List<Orderinfo> selectOrderinfoPage(@Param("orderState")String orderState){
        return orderMapper.selectOrderinfoPage(orderState);
    }

    /**
     * 购票
     * @param orderId 订单id
     * @param userId     用户ID，标识购票用户
     * @param scheduleId 排片ID，标识具体的放映场次
     * @param position   座位位置信息
     * @param price      票价
     * @param seatId 座位id
     * @return 受影响的行数
     */
    @Override
    public int buyTickets(String orderId, Integer userId, long scheduleId, String position, int price, String seatId) {
    // 调用 orderMapper 的 buyTickets 方法，插入订单信息并返回操作结果
    // 参数包括：订单ID、用户ID、场次ID、座位位置、票价
    int re = orderMapper.buyTickets(orderId, userId, scheduleId, position, price);

    // 如果订单插入成功（re > 0），继续处理座位锁定逻辑
    if (re > 0) {
        // 将座位ID字符串按逗号分隔，转换为字符串数组
        String[] split = seatId.split(",");

        // 将字符串数组转换为列表，方便后续操作
        List<String> list = Arrays.asList(split);

        // 调用 seatsMapper 的 updateSeats 方法，更新座位状态（如锁定座位）
        int upd = scheduleSeatMapper.updateScheduleSeat(list);

        // 如果座位更新成功（upd > 0），打印日志信息
        if (upd > 0) {
            System.out.println("锁定座位！");
        }
    }

    // 返回订单插入操作的结果（成功或失败）
    return re;
}

    /**
     * 修改订单状态
     * @param orderId 订单id
     * @param state 状态
     * @return 受影响的行数
     */
    @Override
    public int updState(String orderId, int state) {
        return orderMapper.updState(orderId, state);
    }

    /**
     * 购买电影票和零食的方法
     *
     * @param orderId 订单ID，用于标识特定的订单
     * @param userId 用户ID，表示购买电影票的用户
     * @param scheduleId 排期ID，指明电影放映的时间
     * @param position 座位位置，描述用户选择的座位
     * @param price 电影票的价格
     * @param snackId 零食ID，表示用户购买的零食
     * @return 返回电影票购买的结果，1表示成功，0表示失败
     *
     * 此方法首先尝试购买电影票，如果购买成功，则尝试更新零食库存
     * 注意，该方法遵循的一种业务逻辑是，只有在电影票购买成功后，才会尝试更新零食库存
     * 这种设计是为了减少库存更新的尝试次数，避免不必要的操作
     */
    @Override
    public int buyTicketsSnacks(String orderId, Integer userId, long scheduleId, String position, int price, String snackId) {
        // 购买电影票
        int re=orderMapper.buyTickets(orderId,userId,scheduleId,position,price);
        // 如果电影票购买成功，则尝试更新零食库存
        if (re>0){
            // 将座位ID字符串按逗号分隔，转换为字符串数组
            String[] split = snackId.split(",");
            // 将字符串数组转换为列表，方便后续操作
            List<String> list = Arrays.asList(split);
            // 更新零食库存
            int i = snacksMapper.updateSnacks(list);
            // 如果零食库存更新成功，则打印信息
            if (i>0){
                System.out.println("修改库存");
            }
        }
        // 返回电影票购买的结果
        return re;
    }

    /**
     * 根据用户id查询个人订单
     *
     * @param userId 用户编号
     * @return 订单信息集合
     */
    @Override
    public List<Orderinfo> findOrdersByUserId(Integer userId) {
        // 调用根据用户id查询个人订单信息的方法
        List<Orderinfo> list = baseMapper.findOrdersByUserId(userId);
        return list;
    }

    /**
     * 根据用户id查询订单信息
     * @param page 当前页数
     * @param limit 显示几页
     * @param userId 用户id
     * @return 订单信息分页对象
     */
    @Override
    public PageInfo<Orderinfo> findOrdersByUserName(Integer page, Integer limit, String userId) {
    // 启用分页功能，设置当前页和每页显示的记录数
    PageHelper.startPage(page, limit);

    // 根据用户ID查询订单列表
    List<Orderinfo> list = this.orderMapper.findOrdersByUserName(userId);

    // 遍历订单列表，补充每个订单的相关信息
    for (Orderinfo order : list) {
        // 设置订单的用户信息，通过用户ID从userMapper中查询用户详情
        order.setOrderUser(this.userMapper.findUserById(order.getUserId()));

        // 查询订单对应的场次信息
        Schedule schedule = this.scheduleMapper.findScheduleById(order.getScheduleId());
        System.out.println("schedule.getSchedulePrice() = " + schedule.getSchedulePrice());  // 打印场次价格用于调试

        // 查询场次对应的影厅信息
        Hall hall = this.hallMapper.findHallById(schedule.getHallId());

        // 设置影厅所属的影院信息
        hall.setHallCinema(this.cinemaMapper.findCinemaById(hall.getCinemaId()));

        // 将影厅信息设置到场次对象中
        schedule.setScheduleHall(hall);

        // 设置场次对应的电影信息
        schedule.setScheduleMovie(this.movieMapper.findMovieById(schedule.getMovieId()));

        // 将场次信息设置到订单对象中
        order.setOrderSchedule(schedule);
    }

    // 创建并返回分页信息对象，包含查询结果
    PageInfo<Orderinfo> info = new PageInfo<>(list);
    return info;
}
    /**
     * 影院管理员查看订单信息
     * @param cinemaId 影院id
     * @return 订单集合
     */

    @Override
    public List<Orderinfo> selectOrderInfoByCinemaId(@Param("cinemaId") Integer cinemaId,
                                                     @Param("orderState") Integer orderState){
        return orderMapper.selectOrderInfoByCinemaId(cinemaId,orderState);
    }
    /**
     * 同意退票方法
     * @param orderId 订单id
     * @return 受影响的行数
     */
    public int agreeRefund(String orderId){
        return orderMapper.agreeRefund(orderId);
    }
    @Override
    public PageInfo<Orderinfo> findOrdersByUser(Integer page, Integer limit, String userId) {
        // 启用分页功能，设置当前页和每页显示的记录数
        PageHelper.startPage(page, limit);

        // 根据用户ID查询订单列表
        List<Orderinfo> list = this.orderMapper.findOrdersByUser(userId);

        // 遍历订单列表，补充每个订单的相关信息
        for (Orderinfo order : list) {
            // 设置订单的用户信息，通过用户ID从userMapper中查询用户详情
            order.setOrderUser(this.userMapper.findUserById(order.getUserId()));

            // 查询订单对应的场次信息
            Schedule schedule = this.scheduleMapper.findScheduleById(order.getScheduleId());
            System.out.println("schedule.getSchedulePrice() = " + schedule.getSchedulePrice());  // 打印场次价格用于调试

            // 查询场次对应的影厅信息
            Hall hall = this.hallMapper.findHallById(schedule.getHallId());

            // 设置影厅所属的影院信息
            hall.setHallCinema(this.cinemaMapper.findCinemaById(hall.getCinemaId()));

            // 将影厅信息设置到场次对象中
            schedule.setScheduleHall(hall);

            // 设置场次对应的电影信息
            schedule.setScheduleMovie(this.movieMapper.findMovieById(schedule.getMovieId()));

            // 将场次信息设置到订单对象中
            order.setOrderSchedule(schedule);
        }

        // 创建并返回分页信息对象，包含查询结果
        PageInfo<Orderinfo> info = new PageInfo<>(list);
        return info;
    }
    /**
     * 根据影院id查询该影院的订单数量
     * @param cinemaId 影院id
     * @return 订单数量
     */
    public int getCinemaManageOrder(@Param("cinemaId") Integer cinemaId){
        return orderMapper.getCinemaManageOrder(cinemaId);
    }
}
